package com.xdf.mcsecurity;

import com.xdf.mcsecurity.model.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 阿里云镜像，maven 下载速度会快点
 * <mirrors>
 * 	<mirror>
 * 		<id>alimaven</id>
 * 		<name>aliyun maven</name>
 * 		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 * 		<mirrorOf>central</mirrorOf>
 * 	</mirror>
 * </mirrors>
 */
@EnableGlobalMethodSecurity(prePostEnabled = true)// 必须有本注解下面的请求 roleBasedReq 才有效
@RestController
// spring官方建议只有一个类使用该注解 @EnableAutoConfiguration
// 本注解自动创建依赖所需的配置，例如依赖中有 mysql 那么会自动创建一个默认的 DataSource
// 如果配置文件中没有设置连接数据库的必要参数则项目无法启动
// 可以通过在后面使用 exclude 排除 DataSource 类的方法避免该错误从而启动项目
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@SpringBootApplication
public class McsecurityApplication {

    public static void main(String[] args) {
        SpringApplication.run(McsecurityApplication.class, args);
    }

    @GetMapping("/")
    public String home(){
        return "hello Spring Security";
    }

    @GetMapping("/hello")
    public String hello(){
        return "hello world";
    }

    // 基于角色的权限控制，下面的角色 ROLE_ADMIN
    // 是类 com.xdf.mcsecurity.security.SpringSecurityConfig.configure(AuthenticationManagerBuilder auth)
    // 中定义的角色，SpringSecurity 默认要求在角色前面使用前缀 ROLE_
    // 所以自定义的角色 ADMIN 配合该前缀要求是角色 ROLE_ADMIN 才可访问本请求
    // 可以验证满足多个角色中的一个：
    //@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
    //@PreAuthorize 是在执行请求之前验证
    //@PostAuthorize 是在执行请求之后验证
    //@PreFilter("") 过滤之前
    //@PostFilter("")过滤之后
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @GetMapping("/br")
    public String roleBasedReq(){
        return "hello role";
    }

    // 2021年2月22日 18:49:36 - 没有测试通过
    @PreAuthorize("#user.username.equals('admin')")
    @GetMapping("/specificUser")
    public String specificUser(User user){
        return "specificUser";
    }
}
